#include<iostream>
using namespace std;
int a[600000];
int stack1[600000];
int f[600000];
int main(){
    int cnt=0;
    int ans=0;
    while(cin>>a[++cnt]);
    int top=0;
    stack1[0]=0x3f3f3f3f;
    for(int i=1;i<=cnt-1;i++){
        if(a[i]<=stack1[top]){
            stack1[++top]=a[i];
            if(ans<top)ans=top;
            f[i]=top;
        }
        else{
            int l=1;
            int r=top;
            int dq=upper_bound(stack1+1,stack1+top,a[i],greater<int>())-stack1;//不带等号找到第一个降序排列中小于
            stack1[dq]=a[i];
        }
    }
      cout<<ans<<endl;
      stack1[0]=0;
      ans=0;
      top=0;
    for(int i=1;i<=cnt-1;i++){
        if(a[i]>stack1[top]){
            stack1[++top]=a[i];
            if(ans<top)ans=top;
        }
        else{
            int l=1;
            int r=top;
            int dq=lower_bound(stack1+1,stack1+top,a[i])-stack1;
            stack1[dq]=a[i];
        }
    }
    cout<<ans;
    return 0;
}